package com.example.miaosha.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.miaosha.common.constants.Constants;
import com.example.miaosha.common.exception.BusinessException;
import com.example.miaosha.common.utils.IdWorkerUtil;
import com.example.miaosha.entity.SeUrl;
import com.example.miaosha.mapper.SeUrlMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Objects;

@Service
public class SeUrlService {
    @Resource
    private SeUrlMapper seUrlMapper;
    private static final String url = "/seckill/buy";
    private static final String decUrl = "/seckill/dynamicBuy/";

    /**
     * 保存短链地址
     * @param oldUrl
     * @param actId
     */
    public void get(String oldUrl,String actId) {
        SeUrl seUrl = new SeUrl();
        seUrl.setId(IdWorkerUtil.nextId());
        seUrl.setOldUrl(oldUrl);
        seUrl.setNewUrl(url);
        seUrl.setActId(actId);
        seUrl.setState(Integer.parseInt(Constants.YES));
        SeUrl old = seUrlMapper.selectOne(new LambdaQueryWrapper<SeUrl>().eq(SeUrl::getActId, actId));
        if (Objects.nonNull(old)) {
            throw new BusinessException("请不要重复给相同的活动添加短链接");
        }
        seUrlMapper.insert(seUrl);
    }

    /**
     * 查询码短链地址活动
     * @param url
     * @return
     */
    public String findAct(String url) {
        String newUrl = decUrl+url;
        SeUrl seUrl = seUrlMapper.selectOne(new LambdaQueryWrapper<SeUrl>()
                .eq(SeUrl::getOldUrl, newUrl)
                .eq(SeUrl::getState,Integer.parseInt(Constants.YES))
        );
        if (Objects.isNull(seUrl)) {
            throw new BusinessException("短链接不存在");
        }
        return seUrl.getActId();
    }

    /**
     * 开启/关闭动态链接
     * @param actId
     */
    @Transactional(rollbackFor = Exception.class)
    public Integer open(String actId) {
        SeUrl seUrl = seUrlMapper.selectOne(new LambdaQueryWrapper<SeUrl>().eq(SeUrl::getActId, actId));
        if(Objects.isNull(seUrl)){
            throw new BusinessException("不存在对应的动态链接");
        }
        Integer state = seUrl.getState();
        if(state.equals(Integer.parseInt(Constants.NO))){
            seUrl.setState(Integer.parseInt(Constants.YES));
        }else {
            seUrl.setState(Integer.parseInt(Constants.NO));
        }
        seUrlMapper.updateById(seUrl);
        return seUrl.getState();
    }

    /**
     * 获取
     * @param actId
     * @return
     */
    public SeUrl findOne(String actId) {
        SeUrl seUrl = seUrlMapper.selectOne(new LambdaQueryWrapper<SeUrl>()
                .eq(SeUrl::getActId, actId)
        );
        if (Objects.isNull(seUrl)) {
            throw new BusinessException("短链接不存在");
        }
        return seUrl;
    }
}
